by Yngie

서포트 벡터 머신 (SVM)

|

본 포스트는 문일철 교수님의 인공지능 및 기계학습 개론 I 강의를 바탕으로 작성하였습니다.

SVM

Decision Boundary

아래에 3개의 분류기 $H_1, H_2, H_3$이 있습니다. 여러분은 3개 중 어떤 분류기가 가장 좋아보이시나요?

svm

이미지 출처 : 위키피디아 - 서포트 벡터 머신

일단 $H_3$을 좋은 분류기라고 하기엔 무리가 있어 보입니다. 총 16개의 인스턴스 중 검은색 클래스인 인스턴스가 8개, 흰색 클래스인 인스턴스가 8개가 있는데 $H_3$은 8개의 검은색과 7개의 흰색을 하나의 클래스로 분류했습니다. 엔트로피(Entropy) 등의 지표를 사용하면 $H_3$이 좋지 않은 분류기임을 알 수 있습니다.

그렇다면 $H_1$과 $H_2$ 중에서는 어떤 분류기가 더 좋은 분류기일까요? 주어진 인스턴스만으로는 두 분류기의 성능 비교를 할 수는 없습니다. 두 분류기 모두 각자의 클래스에 맞게 분류를 잘 해냈기 때문이지요. 그러나 언뜻 보기에는 $H_2$가 조금 더 좋아 보입니다. “좋아 보이는 분류기의 비밀”은 바로 결정 경계(Decision boundary)에 있습니다. 위 그래프에 새로운 인스턴스를 추가해보도록 하겠습니다.

svm_add_data

4개의 인스턴스가 추가되었습니다. 이 4개의 인스턴스는 $H_1, H_2$ 중 어떤 분류기를 사용하여 분류하는 지에 따라서 클래스가 달라집니다. 하지만 언뜻 보아도 위쪽 2개의 인스턴스는 검은색 클래스에, 아래쪽 2개의 인스턴스는 흰색 클래스에 더 가까워 보입니다. 인스턴스의 클래스가 실제로도 위쪽 2개는 검은색 클래스, 아래쪽 2개는 흰색 클래스라고 해보겠습니다. 아래는 이를 표시한 그림입니다.

svm_add_data1

이제는 $H_2$분류기와 $H_1$중 어느 분류기가 더 좋은지 알 수 있게 되었습니다. 세 개의 분류기 중 모든 인스턴스를 잘 분류하고 있는 것은 $H_2$뿐입니다.

SVM

서포트 벡터 머신(Support Vector Machine, SVM)은 위 그림에서 빨간색으로 나타나는 분류기 $H_2$를 찾기 위한 알고리즘 입니다.

서포트 벡터 머신이 결정 경계를 찾는 방식은 다음과 같습니다. 먼저, 각 클래스에서 앞쪽(상대 클래스와 가까운 쪽)에 위치한 3개의 벡터를 찾습니다. 3개의 벡터를 선정하는 방법은 다음과 같습니다. 먼저, 각 클래스에서 가장 앞에 있는 벡터를 하나씩 찾습니다. 나머지 하나의 벡터는 클래스에 상관없이 가장 앞쪽에 위치한 것으로 찾습니다.

3개의 벡터를 찾으면 같은 클래스에 속해 있는 2개의 벡터를 찾아 이를 연결하는 하나의 직선을 긋습니다. 다음으로 이 직선과 평행하면서 나머지 하나의 벡터를 지나는 직선을 긋습니다. 마지막으로 평행선의 중점을 지나며 평행선과 평행한 하나의 직선을 더 그을 수 있는데 이 직선이 서포트 벡터 머신의 결정 경계입니다. 결정 경계를 찾는 데에 벡터의 도움을 받기 때문에 서포트 벡터 머신이라는 이름이 붙었습니다. 아래는 이렇게 구해진 서포트 벡터 머신의 결정 경계를 표시한 것입니다.

SVM_DB2

이미지 출처 : 위키피디아 - 서포트 벡터 머신

Margin

이렇게 결정된 결정 경계(실선)로부터 양쪽 직선(점선)까지의 거리를 마진(Margin)이라고 합니다. 결정 경계는 위 그림에서 볼 수 있듯 $\mathbf{w} \cdot \mathbf{x} + b = 0$으로 나타냅니다. 새로운 데이터가 들어올 경우에는 결정 경계를 기준으로 $\mathbf{w} \cdot \mathbf{x} + b > 0$ 인지 $\mathbf{w} \cdot \mathbf{x} + b > 0$ 인지에 따라서 클래스를 결정합니다. 위 그림에서는 $\mathbf{w} \cdot \mathbf{x} + b > 0$ 이면 검은색 클래스로 분류되고, $\mathbf{w} \cdot \mathbf{x} + b < 0$이면 흰색 클래스로 분류됩니다.

$\mathbf{w} \cdot \mathbf{x} + b > 0$ 인 경우를 Positive case라고 하고 $\mathbf{w} \cdot \mathbf{x} + b < 0$ 인 경우를 Negative case라고 하겠습니다. 그리고 각자의 인스턴스의 실제 클래스는 $y_i$라고 하겠습니다. 이제 신뢰도(Confidence level) $(\mathbf{w} \cdot \mathbf{x} + b)y_i$을 구할 수 있습니다. 이 신뢰도를 최대화하는 것이 서포트 벡터 머신의 목표가 됩니다.

\[\text{argmax} \sum_i (\mathbf{w} \cdot \mathbf{x} + b)y_i\]

신뢰도에서 $y_i$값은 실제 클래스이므로 어떤 결정 경계를 택하더라도 변화가 없습니다. 그렇기 때문에 $\mathbf{w} \cdot \mathbf{x} + b$에 해당하는 마진을 최대화하는 것이 중요합니다. 결정 경계 위에 있는 인스턴스를 $x_p$라고 하면 임의의 인스턴스 $x$는 거리 $r$을 사용하여 다음과 같이 나타낼 수 있습니다.

\[x = x_p + r \frac{w}{\Vert w\Vert}\]

$f(\mathbf{x}) = \mathbf{w} \cdot \mathbf{x} + b$이면 $f(x_p) = 0$이므로 위 식을 이용하여 $r$에 대한 식으로 정리할 수 있습니다.

\[f(x) = w \cdot x + b = w \cdot (x_p + r \frac{w}{\Vert w \Vert}) + b = wx_p + b + r\frac{w \cdot w}{\Vert w\Vert} \\ \because wx_p + b = 0, \quad f(x) = r\frac{w \cdot w}{\Vert w\Vert} = r\frac{\Vert w\Vert^2}{\Vert w\Vert} = r \Vert w\Vert \\ \therefore r = \frac{f(x)}{\Vert w\Vert}\]

좋은 결정 경계를 위해서는 마진, 즉 서포트 벡터 까지의 거리 $r$을 최대로 늘려야 합니다. 서포트 벡터 $x_s$에 대해서 $f(x_s) = w\cdot x_s + b = 1$이므로 거리 $r_s$를 아래와 같이 나타낼 수 있습니다.

\[r_s = \frac{1}{\Vert w \Vert}\]

즉, $r_s$ 최대로 하는 $w, b$는 $\Vert w \Vert$ 를 최소로하는 $w, b$와 같게 됩니다. 이를 수식으로 정리하면 다음과 같이 나타낼 수 있습니다.

\[\max_{w,b} 2r = \max_{w,b}\frac{2}{\Vert w\Vert} = \min_{w,b} \Vert w\Vert \qquad s.t. (wx_j + b)y_j \geq 1\]

위에서 $\Vert w \Vert$를 최소화하는 하는 방향으로 최적화를 진행합니다.

Losses

항상 모든 데이터를 두 쪽으로 분류할 수 있는 것은 아닙니다. 훈련 데이터가 아래와 같이 주어져 있다고 해보겠습니다.

soft_SVM

이미지 출처 : researchgate.net

위 그림에서는 Class2(빨간색 세모)의 가장 앞쪽 벡터의 뒤쪽에 Class1인 인스턴스가 위치해 있습니다. 실선으로 나타낸 결정 경계는 이 인스턴스를 잘못 분류하게 됩니다. 데이터가 이렇게 주어질 경우 인스턴스를 처리하는 방법은 크게 두 가지가 있습니다.

첫 번째는 분류기를 벗어나는 Error case에 벌칙을 주는(Penalization) 방법입니다. 관련 내용은 정칙화(Regularization)에서도 볼 수 있습니다. 두 번째는 비선형(Non-linear) 결정 경계를 긋는 방법입니다. 먼저 첫 번째 방법에 대해서 알아보도록 하겠습니다.

Error case에 벌칙을 주는 기준에 따라 두 가지로 나눌 수 있습니다. 먼저, Error case에 해당하는 인스턴스의 개수를 기준으로 벌칙을 가하는 방법입니다. 이렇게 에러의 개수에 해당하는 $#_\text{error}$를 0-1​ 손실(Loss)라고 합니다. 목적함수의 식을 아래 처럼 나타낼 수 있습니다.

\[\min_{w,b} \Vert w\Vert + C \times \#_{error} \quad s.t.(wx_j + b) \geq 1\]

멀리 떨어진 Error case 인스턴스에 더 강한 벌칙을 가하는 방법도 있습니다. 이렇게 멀리 떨어진 가중치를 가하여 구하는 손실을 힌지 손실(Hinge Loss)라 하고 $\xi_i$로 나타냅니다. 힌지 손실은 동일 클래스의 서포트 벡터에서 $0$이며 결정 경계에서는 $1$이 됩니다. 결정 경계에서 반대 클래스 쪽으로 거리가 멀어질수록 선형적으로 증가합니다. 이 방법을 다음과 같이 나타낼 수 있습니다.

\[\min_{w,b} \Vert w\Vert + C \sum_j \xi_j \quad s.t.(wx_j + b) \geq 1 - \xi_j\]

아래는 0-1 손실(초록색 실선)과 힌지 손실(파란색 실선)을 나타낸 것입니다.

losses

이미지 출처 : wikipedia - Hinge loss

실제로는 두 번째 방법을 더 많이 사용합니다. 0-1 손실은 Quadratic으로 구현하기 어려우며 Error의 정도를 반영하지 못하기 때문입니다.

Soft Margin SVM

이렇게 에러를 고려하는 서포트 벡터 머신 모델을 소프트 마진 서포트 벡터 머신(Soft margin SVM)이라고 합니다. 반대로 하나의 오차도 허용하지 않는 모델을 하드 마진 서포트 벡터 머신(Hard margin SVM)이라고 합니다. 아래 그림을 보며 둘의 차이를 알아보겠습니다.

이미지 출처 : medium.com

꼭 한 클래스의 데이터가 다른 클래스 데이터 사이에 들어가 있지 않더라도 소프트 마진 서포트 벡터 머신을 사용할 수 있습니다. 이 경우에 소프트 마진 서포트 벡터 머신은 에러에 대해 강건(Robust)하다는 장점이 있습니다. 아래의 왼쪽과 오른쪽 그림은 데이터를 소프트 마진 서포트 벡터 머신과 하드 마진 서포트 벡터 머신으로 분류했을 때를 그림으로 나타낸 것입니다.

hard_vs_soft

이미지 출처 : quora.com

오른쪽 하드 마진 소프트벡터 머신은 한 개의 인스턴스도 빠뜨리지 않고 서포트 벡터 후보에 포함시키기 때문에 마진이 작은 결정 경계를 형성하게 됩니다. 반대로 소프트 마진을 적용하면 발생한 에러 하나를 무시하고 더 넓은 마진을 가지는 결정 경계를 선택한 것을 볼 수 있습니다.

소프트 마진 서포트 벡터 머신의 손실 함수를 조정하면 에러를 얼마나 고려해 줄 지를 결정할 수 있습니다. $C$ 하미퍼파라미터를 조정하여 이를 조정합니다. 위에서 사용했던 힌지 손실을 사용한 손실 함수 수식을 다시 가져와 보겠습니다.

\[\min_{w,b, \xi_j} ||w|| + C \sum_j \xi_j \quad s.t.(wx_j + b) \geq 1 - \xi_j\]

하이퍼파라미터 $C$가 커지면 커질수록 힌지 손실 값 $\xi_i$ 에 대하여 더 많은 벌칙을 가하게 됩니다. 그렇기 때문에 하나의 Error case도 허용하지 않기 위해 굉장히 마진이 좁은 결정 경계를 형성하게 되지요. 반대로 $C$가 줄어들면 Error case에 대한 벌칙이 줄어들기 때문에, Error에 강건한 결정 경계를 형성하게 됩니다. 아래는 $C$ 가 각각 $1000, 10, 0.1$로 설정한 소프트 마진 서포트 벡터 머신의 결정 경계입니다.

얼핏 보면 주어진 데이터에서는 $C$가 늘어날수록 올바른 결정 경계가 형성되는 것처럼 보입니다. 하지만 항상 그런 것은 아니기 때문에 $C$값을 조정해가며 생성되는 모델을 잘 비교한 뒤에 모델을 선택해야 합니다.

hyperpara_C

이미지 출처 : stackoverflow.com

Kernal Trick

에러를 허용하는 분류기 모델은 하나의 대안일 뿐 데이터를 잘 분류하는 분류기라고는 할 수 없습니다. 이럴 때에는 SVM의 특정 방법을 사용하여 비선형(Non-linear) 결정 경계를 그려 분류하게 됩니다.

non-linear

이미지 출처 : researchgate.net

기본적인 아이디어는 차원을 확장하여 두 데이터를 완전히 분류하는 방법과 동일합니다. 이런 방법은 선형 회귀에서 보았던 다항 회귀(Polynomial regression)와도 비슷하다고 할 수 있습니다.

하지만 SVM에서는 마구잡이로 데이터의 차원을 늘리면 계산량이 급격히 증가하게 되어 학습 시간과 컴퓨팅 자원을 많이 소모하게 됩니다. 이런 문제를 해결하기 위해 등장한 것이 커널 트릭(Kernel trick)입니다. 커널 트릭을 사용하면 계산량을 늘리지 않고도 Non-linear한 결정 경계를 그려낼 수 있습니다.



Comments